package com.apollow.oschina.view;

import android.content.Context;
import android.view.View;
import android.widget.FrameLayout;

import com.apollow.oschina.R;
import com.apollow.oschina.base.Global;
import com.apollow.oschina.util.ResultState;
/**
 * Created by Administrator on 2016/12/8 0008.
 * 片段的公共界面
 *
 */
public abstract class ContentPager extends FrameLayout {

    //片段界面分为四个模块界面  ： errorView successView emptyView loadingView
    private View errorView;
    private View successView;
    private View emptyView;
    private View loadingView;
    // 状态常量
    private final static  int STATE_DEFAULT=0;
    public final static  int STATE_SUCCESS=1;
    public final static  int STATE_ERROR=2;
    public final static  int STATE_EMPTY=3;
    private final static  int STATE_LOADING=4;
    private int state=STATE_DEFAULT;
    public ContentPager(Context context) {
        super(context);
        initPager();
    }
   //1. 初始化页面
    private void initPager() {
        //1.1 添加访问网络出错界面
        if(errorView==null){
            errorView=onCreateErrorView();
            this.addView(errorView);
        }
        //1.2 添加为空界面
        if(emptyView==null){
            emptyView=onCreateEmptyView();
            this.addView(emptyView);
        }
        //1.3 添加访问网络出错界面
        if(loadingView==null){
            loadingView=onCreateLoadingView();
            this.addView(loadingView);
        }
        //1.4 成功界面  ，因为成功界面是比较复杂，且要访问网络成功后，则显示
        //建议当访问网络，且成功之后，再初始化
        showPager();
        loadDataOrRefreshData();
    }
    private void showPager() {
        if(loadingView!=null){
            if(state==STATE_LOADING||state==STATE_DEFAULT){
                loadingView.setVisibility(View.VISIBLE);
            }else{
                loadingView.setVisibility(View.INVISIBLE);
            }
        }
        //2.2 显示 访问网络出错界面
        if(errorView!=null){
            errorView.setVisibility(state==STATE_ERROR?View.VISIBLE:View.INVISIBLE);
        }

        //2.3 显示为空界面
        if(emptyView!=null){
            emptyView.setVisibility(state==STATE_EMPTY?View.VISIBLE:View.INVISIBLE);
        }
        //2.4 显示成功界面
        //2.4.1 当successView为空，则初始化成功界面
        //if(successView==null&&state==STATE_SUCCESS)
        if(successView==null) {
            successView=onCreateSuccessView();
            if(successView!=null){
                this.addView(successView);
            }else{
                throw  new IllegalArgumentException("创建成功界面失败，参数异常");
            }
        }
        //2.4.2 依据状态显示成功界面
        if(successView!=null){
            successView.setVisibility(state==STATE_SUCCESS?View.VISIBLE:View.INVISIBLE);
        }
    }
    //3. 访问网络获取数据、刷新数据
    public void loadDataOrRefreshData(){
        if(state==STATE_SUCCESS||state==STATE_EMPTY||state==STATE_ERROR){
            state=STATE_DEFAULT;
        }
        //当重置后的状态是STATE_DEFAULT就开始访问网络 ，排除正在加载状态 防止重复访问网络
        if(state==STATE_DEFAULT){
            //开始访问网络
            new Thread(new Runnable() {
                @Override
                public void run() {
                   // LogUtil.d("ContentPager","ContentPager-->loadDataOrRefreshData");
                    //访问网络的方法
                  //int
                   final ResultState resultState=onLoadData();
                    //依据状态刷新界面 ,因为showPager等方法要操作UI控件，所以该任务要在主线程运行
                    Global.runOnUIThread(new Runnable() {
                        @Override
                        public void run() {
                            if(resultState!=null){
                                //通过枚举对象，获取状态值，再更新state状态变量
                                state=resultState.getState();
                            }

                            showPager();
                        }
                    });

                }
            }).start();

        }
    }
    protected abstract ResultState onLoadData();

    protected abstract View onCreateSuccessView();

    private View onCreateLoadingView() {
        return Global.layoutInflate(R.layout.layout_loading);
    }
    private View onCreateEmptyView() {
        return Global.layoutInflate(R.layout.layout_empty);
    }
    private View onCreateErrorView() {
        return Global.layoutInflate(R.layout.layout_error);
    }
}
